﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

using modActor;
using modUtileria;
using modDatos;
using modPeticiones;
using modLanGame;


namespace modElenco
{
    public class CBulletMng : modActor.CActor
    {
        CBulletMngDatos dataBullet;

        public CBulletMng()
        {
            base.init();

            dataBullet = new CBulletMngDatos();

            data.escenarioDatos.primarykey = "BulletMng";
            SCutileria.suministratrUtileria(this, "textura2D", "Bullet/bullet");

            data.drawDatos.frameActual = 1;
            data.drawDatos.frameTotal = 1;                    
        }

        public override void ensayar(Microsoft.Xna.Framework.GameTime gameTime)
        {
            base.ensayar(gameTime);

            dataBullet.lsBalas.Clear();

            Dictionary<string, CDataGameBase> dataBase = SCPeticion.BuscarDatos("Bullet");
            foreach (KeyValuePair<string, CDataGameBase> item in dataBase)
            {
                dataBullet.lsBalas.Add(item.Key, (CBalasDatos)item.Value);
            }

            setearPosicionBalas();

            //colicion con asteroides
            CAsteroidesDatos asteroide = new CAsteroidesDatos();
            CBalasDatos bala = new CBalasDatos();
            
            Dictionary<string, CDataGameBase> newAsteroid = new Dictionary<string, CDataGameBase>();
            Dictionary<string, CDataGameBase> newBalas = new Dictionary<string, CDataGameBase>();

            bool chocoBala = false;
            Random rand = new Random();

            foreach (KeyValuePair<string, CBalasDatos> item1 in dataBullet.lsBalas)
            {
                bala = item1.Value;

                foreach (KeyValuePair<string, CDataGameBase> item2 in SCPeticion.BuscarDatos("Asteroid"))
                {
                    asteroide = (CAsteroidesDatos)item2.Value;

                    Rectangle rec = new Rectangle((int)bala.posicionActual.X, (int)bala.posicionActual.Y,20,20);

                    if (modCollision.SCCollision.DetectBnB(rec, new Rectangle((int)asteroide.posicionActual.X, (int)asteroide.posicionActual.Y, 90, 90)) != Rectangle.Empty)
                    {
                        //chocaron
                        asteroide.vida -= 1;
                        chocoBala = true;
                        _BlackGlobal.score++;
                    }
                    else
                    {
                        chocoBala = false;
                    }
                }

                if (chocoBala == false)
                {
                    while (newBalas.ContainsKey(bala.name))
                    {
                        bala.name += rand.Next(9999).ToString();
                    }
                    newBalas.Add(bala.name, bala);
                }
            }

            SCPeticion.EliminarDatos("Bullet");
            dataBullet.lsBalas.Clear();

            foreach (KeyValuePair<string, CDataGameBase> item in newBalas)
            {
                SCPeticion.DatosGame.Add(item.Key, item.Value);
                bala = (CBalasDatos)item.Value;
                dataBullet.lsBalas.Add(item.Key, bala);
            }
        }

        public override void drawInEscenary(ref Microsoft.Xna.Framework.Graphics.SpriteBatch sprite)
        {
            foreach (KeyValuePair<string, CBalasDatos> item in dataBullet.lsBalas)
            {
                sprite.Draw(data.drawDatos.texture,
                    new Microsoft.Xna.Framework.Rectangle((int)item.Value.posicionActual.X, (int)item.Value.posicionActual.Y, 20, 20),
                    Microsoft.Xna.Framework.Color.White
                    );
            }
        }

        void setearPosicionBalas()
        {
            CBalasDatos bala;

            Dictionary<string, CDataGameBase> Disparos = SCPeticion.BuscarDatos("Bullet");
            Dictionary<string, CDataGameBase> DisparosNuevos = new Dictionary<string,CDataGameBase>();

            float x1, x2, y1, y2;
            float pendiente;
            float ordenada;

            float ny;

            foreach (KeyValuePair<string, CDataGameBase> item in Disparos)
            {
                bala = (CBalasDatos)item.Value;
                
                //busco la funcion de la recta;
                x1 = bala.posicionActual.X;
                x2 = bala.posicionAnterior.X;                
                y1 = bala.posicionActual.Y;
                y2 = bala.posicionAnterior.Y;

                pendiente = (y2 - y1) / (x2 - x1);
                ordenada = -1 * ((pendiente * x2) - y2);

                if (x2 > x1)
                {
                    ny = pendiente * (x1 - 5) + ordenada;
                    bala.posicionActual.X = x1 - 5;
                }
                else
                {
                    ny = pendiente * (x1 + 5) + ordenada;
                    bala.posicionActual.X = x1 + 5;
                }
                
                bala.posicionActual.Y = ny;                

                DisparosNuevos.Add(item.Key, item.Value);
                
            }

            SCPeticion.EliminarDatos("Bullet");

            foreach (KeyValuePair<string, CDataGameBase> item in DisparosNuevos)
            {
                SCPeticion.DatosGame.Add(item.Key, item.Value);
            }
        }
    }
}
